/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.aeso.betabit.service.rmi;

import br.aeso.betabit.dao.ApostaDao;
import br.aeso.betabit.dao.ApostadorDao;
import br.aeso.betabit.dao.EventoDao;
import br.aeso.betabit.entity.Aposta;
import br.aeso.betabit.entity.Apostador;
import br.aeso.betabit.entity.Evento;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author Edson
 */
public class ApostaServiceImpl extends UnicastRemoteObject implements ApostaService {
    
    private ApostaDao apostaDao;
    private ApostadorDao apostadorDao;
    private EventoDao eventoDao;
    
    public ApostaServiceImpl() throws RemoteException {
        apostaDao = new ApostaDao();
        apostadorDao = new ApostadorDao();
        eventoDao = new EventoDao();
    }

    @Override
    public void inserir(Aposta obj) throws RemoteException {
        bindDbData(obj);
        apostaDao.inserir(obj);
    }
    
    @Override
    public void atualizar(Aposta obj) throws RemoteException {
        bindDbData(obj);
        apostaDao.atualizar(obj);
    }
    
    @Override
    public void excluir(Aposta obj) throws RemoteException {
        apostaDao.excluir(obj);
    }
    
    @Override
    public Aposta consultar(Long codigo) throws RemoteException {
        return apostaDao.consultar().get(0);
    }

    private void bindDbData(Aposta aposta) {
        aposta.setApostador(getApostadorFromDb(aposta.getApostador()));
        aposta.setEvento(getEventoFromDb(aposta.getEvento()));
    }

    private Apostador getApostadorFromDb(Apostador apostador) {
        Iterator<Apostador> it = apostadorDao.consultar().iterator();
        while (it.hasNext()) {
            Apostador apostadorFromDb = it.next();
            if (apostadorFromDb.getCodigo().equals(apostador.getCodigo())) {
                return apostadorFromDb;
            }
        }
        throw new IllegalArgumentException("Apostador Inválido: " + apostador.getCodigo());
    }
    
    private Evento getEventoFromDb(Evento evento) {
        Iterator<Evento> it = eventoDao.consultar().iterator();
        while (it.hasNext()) {
            Evento eventoFromDb = it.next();
            System.out.println("DB: " + eventoFromDb.getDescricao() + " - " + "View: " + evento.getDescricao());
            if (eventoFromDb.getDescricao().equals(evento.getDescricao())) {
                return eventoFromDb;
            }
        }
        throw new IllegalArgumentException("Evento Inválido: " + evento.getDescricao());
    }

    @Override
    public List<Evento> getEventos() throws RemoteException {
        return eventoDao.consultar();
    }
}